import os
def get_dir_tree(path):  
    """
    [  
              {
                "path":"config",
                name:"config",
                "idx":"0",
                type:"dir",
                child:[
                                  {  
                      "path": '',  
                      "name": "Folder A",  
                      type:'dir',
                      "child": [  
                        {  
                          "path": '', 
                          "name": "File A.txt",  
                          type:'.txt', 
                        },  
                        {  
                          "path": '', 
                          "name": "File B.jpg", 
                          type:'.txt', 
                        }  
                      ]  
                    },
                    {  
                      "path": '',  
                      "name": "文件夹2",  
                      type:'dir',
                      "child": [  
                        {  
                          "path": '', 
                          "name": "项目1.yaml",  
                          type:'.yaml', 
                        },  
                        {  
                          "path": '', 
                          "name": "项目2.yaml", 
                          type:'.yaml', 
                        }  
                      ]  
                    },
                                  ]
              }
]
    """
    idx_count=-1
    res=[]
    #初始化要处理的列表 存储的是文件夹信息
    path_lst=[
        {"idx_lst":[],
         "path":path
        }
        ]
    #循环遍历列表 直到没有需要处理的文件夹
    while path_lst:
        #计数+1
        idx_count+=1
        #获取文件夹信息：文件夹完整路径 和存储索引
        new_item=path_lst.pop(0)
        #存储索引 [0,0,1] 对应res[0][0][1]
        idx_lst=new_item['idx_lst']
        #文件夹的完整路径
        new_path=new_item['path']
        #获取要操作的列表
        add_lst=res
        for idx in idx_lst:
            add_lst=add_lst[idx]['child']
        #将文件夹添加进res中
        add_lst.append(
            {
                "path":new_path,#文件夹完整路径
                "name":os.path.basename(new_path),#文件夹名称
                "idx":idx_count,#文件夹、文件 计数
                "type":"dir",#类型是文件夹
                "child":[]#存储文件夹内的文件 和文件数据
            }
        )
        #新的存储索引
        now_idx_lst=idx_lst+[len(add_lst)-1]
        #新的存储列表
        add_lst=add_lst[-1]['child']
        #遍历文件夹 将文件存入res 将文件夹传入path_lst
        for file_name in os.listdir(new_path):
            #拼接完整路径
            path_full=new_path+os.sep+file_name
            #是文件夹则将文件夹数据存入待处理列表
            if os.path.isdir(path_full):
                path_lst.append(
                        {"idx_lst":now_idx_lst,
                        "path":path_full
                        })
            #是文件则直接处理 添加进res
            else:
                #计数+1
                idx_count+=1
                base_name, file_extension = os.path.splitext(file_name)  
                add_lst.append(
                    {
                    "path":path_full,#文件完整路径
                    "name":os.path.basename(path_full),#文件名称
                    "idx":idx_count,#文件夹、文件 计数
                    "type":file_extension,#文件类型 如 .txt
                    "child":[]#存储文件夹内的文件 和文件数据
                }
                ) 
    return res
if __name__=='__main__':
    print(get_dir_tree(os.path.dirname(os.path.abspath(__file__))+os.sep+"test"+os.sep+"get_dir_tree"))